package modelovectorial;

import utn.frc.tsb.utils.ValerioFritelli.SimpleList.SimpleList;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase representa una palabra con signos de puntuacion, la cual esta
 * asociada a una palabra limpia sin signos de puntuacion.
 */
public class PalabraSucia implements Comparable {

    private int mIdTerminoSucio;
    // palabra con los signos de puntuacion
    private String palabra = "";
    // todos los indices dentro del documento
    private SimpleList indices = new SimpleList();
    // cantidad de documentos en los que aparece el termino
    private int idTerminoLimpio = 0;

    /**
     * Constructor por parametros que inicializa los atributos de la clase.
     *
     * @param palabra
     * @param idPalabraLimpia
     */
    public PalabraSucia(String palabra, int idPalabraLimpia) {
        this.palabra = palabra;
        this.idTerminoLimpio = idPalabraLimpia;
    }

    /**
     * Setea el identificador del termino.
     *
     * @param pIdTerminoSucio entero que contiene el identificador de la clase.
     */
    public void setIdTerminoSucio(int pIdTerminoSucio) {
        mIdTerminoSucio = pIdTerminoSucio;
    }

    /**
     * Devuelve el identificador del termino.
     *
     * @return un entero que contiene el identificador del termino.
     */
    public int getIdTerminoSucio() {
        return mIdTerminoSucio;
    }

    /**
     * Constructor por parametros que inicializa los atributos de la clase.
     *
     * @param palabra
     */
    public PalabraSucia(String palabra) {
        this.palabra = palabra;
    }

    /**
     * Constructor por parametros que inicializa los atributos de la clase.
     *
     * @param pIndex
     * @param pPalabra
     */
    public PalabraSucia(int pIndex, String pPalabra) {
        palabra = pPalabra;
        agregarIndice(pIndex);
    }

    /**
     * Devuelve una lista simple con los indices de aparicion dentro del
     * documento del termino.
     *
     * @return
     */
    public SimpleList getIndices() {
        return indices;
    }

    /**
     * Setea la lista de indices de aparicion del termino en el documento.
     *
     * @param indices lista que contiene los indices de aparioion del termino.
     */
    public void setIndices(SimpleList indices) {
        this.indices = indices;
    }

    /**
     * Devuelve una cadena que contiene el termino con los signos de puntuacion.
     *
     * @return cadena que contiene el termino.
     */
    public String getPalabraSucia() {
        return palabra;
    }

    /**
     * Setea el termino que representa el objeto.
     *
     * @param palabra cadena que contiene la palabra a setear.
     */
    public void setPalabraSucia(String palabra) {
        this.palabra = palabra;
    }

    /**
     * Agrega un nuevo indice de aparicion del termino dentro del documento.
     *
     * @param indice entero que representa el indice de aparicion a agregar.
     */
    public final void agregarIndice(int indice) {
        indices.addFirst(indice);
    }

    /**
     * Redefine el metodo equals para adaptarlo a la clase PalabraSucia.
     *
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PalabraSucia other = (PalabraSucia) obj;
        if ((this.palabra == null) ? (other.palabra != null) : !this.palabra.equals(other.palabra)) {
            return false;
        }
        return true;
    }

    /**
     * Redefine el metodo hashCode para adaptarlo a la clase PalabraSucia.
     *
     * @return un entero con el valor que identifica al objeto.
     */
    @Override
    public int hashCode() {
        return Math.abs(this.palabra.hashCode());
    }

    /**
     * Redefine el metodo compareTo() para adaptarlo a la clase PalabraSucia.
     *
     * @param o
     * @return
     */
    public int compareTo(Object o) {
        String otro = ((PalabraSucia) o).getPalabraSucia();
        return palabra.compareTo(otro);
    }

    /**
     * Devuelve el identificador de la palabra sin signos de puntuacion a la que
     * el termino actual esta asociado.
     *
     * @return un entero que representa el identificador del termino sin signos
     * de puntuacion.
     */
    public int getIdTerminoLimpio() {
        return idTerminoLimpio;
    }

    /**
     * Setea el identificador de la palabra sin signos de puntuacion a la que el
     * termino actual esta asociado.
     *
     * @param idTerminoLimpio entero que representa el identificador del termino
     * sin signos a setear.
     */
    public void setIdTerminoLimpio(int idTerminoLimpio) {
        this.idTerminoLimpio = idTerminoLimpio;
    }
}
